Repository navigation
chore(phpstan): analyse statique niveau 5 sans baseline (463 → 0) - #339
Merged
Merged
Conversation
… baseline PHPStan (463 → 250)
…tration_number vers matricule élève
…— 82 erreurs (246 → 162)
…iqueMatricule (162 → 124)
…pe & create (87 → 81)
- CashAccountController: la contrainte INCOME du withSum était ignorée (closure passée en 3e arg positionnel) → syntaxe tableau, total_income ne compte plus que les transactions INCOME. - BackupService: garde l'échec de tempnam() (string|false) et retire le `! empty($chunk)` mort sur array_chunk. - BulletinRenderer / PayrollService: retire le `!== null` redondant après isset(). - FrenchNumberSpeller: remplace le fallback hors-plage UNITS[$n] par une LogicException explicite. - StudentTestSeeder: resolveAcademicYear() ne retourne jamais null, type de retour non-nullable + condition d'inscription simplifiée. - HasMatricule / ArchiveController: type `self` sur la closure creating, retrait de la constante TYPES morte. - Baseline régénérée : 47 faux positifs résiduels (alias de requêtes selectRaw/withCount, relations Spatie, auth multi-modèle Sanctum).
…line (47 → 0)
Niveau 5 désormais vert SANS baseline : le fichier phpstan-baseline.neon est
supprimé et son include retiré de phpstan.neon.
Typage honnête (pas de suppression) :
- Portail API (ApiController, AuthController, ChildrenController) : le principal
authentifié est Student|Guardian (gardes Sanctum), annoté comme tel → instanceof,
collect() et currentAccessToken() se résolvent.
- Lignes d'agrégat (Enrollment/StudentStats/Dashboard/Payroll) : résultats
selectRaw/jointures typés via variables intermédiaires (object{...}).
- OfficialExam : @property-read pour les alias withCount.
- User / Student : relation Spatie roles et pivot guardian_student typés.
- TimetableController : closure $range et forme de la grille typées.
Vrais bugs corrigés au passage :
- ArchiveController : le libellé d'archive d'un élève affichait un nom vide
(Student n'a pas de colonne « name ») → compose prénom + nom.
- Migration evaluations : ->after() était chaîné sur la définition de clé
étrangère (ignoré) → réordonné pour positionner la colonne.
- Migration matricules : retrait d'un ->unique()->index() sans effet.
Code mort retiré (enums/colonnes NOT NULL → arms inatteignables) :
CashAccount::typeLabel, HasMatricule::method_exists.
DocumentRenderer : genre/date de naissance lus via getAttribute() (mixed) car
$student peut être un modèle NON persisté (aperçu/test) dont les colonnes NOT
NULL sont nulles — les gardes défensives sont conservées.
StatisticsService : unique suppression inline documentée (count() sur GROUP BY
+ HAVING ; un count() SQL compterait par groupe, pas les groupes).
…ederHardeningTest) Un commit précédent avait retiré les `?->` sur $this->command, jugés superflus par PHPStan (Seeder::$command est typé non-nul par le framework). Mais la propriété vaut null quand run() est appelé directement, hors `db:seed` — ce que font les seeders invoqués programmatiquement et SeederHardeningTest, d'où un « Call to a member function warn()/info() on null » en CI. - Rétablit `$this->command?->` dans les 5 seeders (comportement identique quand la commande console est présente, sûr quand elle est absente). - phpstan.neon : règle ignoreErrors ciblée et documentée pour le faux positif nullsafe.neverNull sur Illuminate\Console\Command dans database/seeders. Suite complète : 505 passants, 0 échec. PHPStan niveau 5 : vert.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Objectif
Intègre PHPStan / Larastan au projet et résorbe l'intégralité de la dette d'analyse statique : niveau 5 passe désormais sans aucune baseline (le fichier
phpstan-baseline.neonest supprimé).Parcours
Démarche
Chaque erreur a été traitée à la source : typage correct quand c'est possible, jamais de suppression de confort. Les rares faux positifs irréductibles du framework sont documentés inline (une seule occurrence restante).
Typage honnête
ApiController,AuthController,ChildrenController) : le principal authentifié estStudent|Guardian(gardes Sanctum), annoté comme tel.Enrollment,StudentStats,Dashboard,Payroll) : résultatsselectRaw/jointures typés par leur forme réelle.OfficialExam:@property-readpour les aliaswithCount.User/Student: relation Spatieroleset pivotguardian_studenttypés.TimetableController: closure et forme de la grille typées.Vrais bugs corrigés au passage
CashAccountController: la contrainteINCOMEduwithSumétait ignorée (closure en 3ᵉ argument positionnel) →total_incomecomptait toutes les transactions.ArchiveController: le libellé d'archive d'un élève affichait un nom vide (Studentn'a pas de colonnename) → compose prénom + nom.evaluations:->after()chaîné sur la définition de clé étrangère (ignoré) → réordonné.UniqueMatricule: comparaisonstring === inttoujours fausse (UUID) → type corrigé.BackupService: échec detempnam()(string|false) non géré.Code mort retiré
Arms de
match/ternaires rendus inatteignables par les enums et colonnes NOT NULL, offsets?? défauttoujours présents, constanteTYPESmorte, guardmethod_existsredondant.Infra
static-analysis(PHP 8.3) exécutantcomposer analyse.analyse.Vérification
[OK] No errorssans baseline.SeederHardeningTest) sont préexistants et sans rapport (seeders appelés hors contexte console →$this->commandnul), vérifié par comparaison sur le code d'origine.